package com.sxj.corejava.code08_常用类.String;

/**
 * @author 石小俊
 * @date 2024年04月03日 13:43
 */
public class Test01_定义字符串 {

    public static void main(String[] args) {
        // 方式一:直接创建
        // 对于该方式来说,其并不符合引用数据类型的特征
        // 因此,该方式原则上不符合面向对象的特征
        // 只是由于字符串过于常用,因此JVM对其的创建做了优化
        // 该方式创建的数据并没有保存在堆中,而是保存到常量池中
        String s1 = "hello";
        String s2 = "hello";
        // 由于此时的字符串并没有在堆中开辟空间
        // 而是保存到了常量池,常量池中的数据如果值相同会存储在同一块空间
        System.out.println(s1 == s2);

        // 方式二:使用构造方法进行创建
        // 该方式的数据是存储在堆中的
        // 在堆中存储数据,只要出现关键字new就会开辟一块空间
        // 与具体的值的大小无关
        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s3 == s4);

        // 下面两种方式都表示创建了一个空字符串
        String s5 = "";
        String s6 = new String();
        System.out.println(s6);
        System.out.println(s5.equals(s6));

        String s7 = null;
        System.out.println(s5 == s7);
        System.out.println(s5.equals(s7));
        // null属于非正常数据,调用任意方法都会抛出空指针异常NullPointerException
//        System.out.println(s7.equals(s5));

        // 字符串数据可以与任意类型的数据进行拼接
        String s8 = "hello";
        int i = 1;
        double d = 3.14;
        boolean b = true;
        System.out.println(s8 + i + d + b);
    }

}
